package com.kun.utils;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.po.TableFill;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

import java.util.Arrays;
import java.util.List;

public class CodeGenerator {

    public static void codeGeneratorByManual(String tableName,String tableNamePrefix ,String databaseName,String modelName){

        String root="root";
        String password="123456";
        String url="jdbc:mysql://localhost:3306/"+databaseName+"?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai";
        String driverName="com.mysql.cj.jdbc.Driver";


        //1. 创建代码生成器对象，执行生成代码操作
        AutoGenerator autoGenerator = new AutoGenerator();

        //2. 设置全局配置
        GlobalConfig globalConfig = new GlobalConfig();
        globalConfig.setOutputDir(System.getProperty("user.dir")+"/src/main/java"); //设置代码生成位置(当前目录下的/src/main/java/com/kun)
        globalConfig.setOpen(false);    			//设置生成完毕后是否打开生成代码所在的目录
        globalConfig.setAuthor("kunkun");    		   //设置作者
        globalConfig.setFileOverride(false);     	//设置是否覆盖原始生成的文件
        globalConfig.setMapperName("%sMapper");    	//设置数据层接口名，%s为占位符，指代模块名称
        globalConfig.setServiceName("%sService");    	//设置Service接口名，%s为占位符，去掉I前缀
        globalConfig.setIdType(IdType.ASSIGN_ID);   //设置Id生成策略  雪花算法
        globalConfig.setDateType(DateType.ONLY_DATE);   //设置时间策略
        globalConfig.setSwagger2(true);         //设置swagger2
        autoGenerator.setGlobalConfig(globalConfig);

        //3. 数据源相关配置：读取数据库中的信息，根据数据库表结构生成代码
        DataSourceConfig dataSource = new DataSourceConfig();
        dataSource.setDriverName(driverName);
        dataSource.setUrl(url);
        dataSource.setUsername(root);
        dataSource.setPassword(password);
        dataSource.setDbType(DbType.MYSQL);     //设置数据库类型
        autoGenerator.setDataSource(dataSource);

        //4. 设置包名相关配置
        PackageConfig packageInfo = new PackageConfig();
        packageInfo.setParent("com.kun");   //设置生成的包名，与代码所在位置不冲突，二者叠加组成完整路径
        packageInfo.setModuleName(modelName);      //设置模块名，例如blog
        packageInfo.setEntity("entity");    //设置实体类包名
        packageInfo.setMapper("mapper");   	//设置数据层包名
        packageInfo.setController("controller");    //设置controller层的包名
        packageInfo.setService("service");          //设置service的包名
        packageInfo.setServiceImpl("service.impl");     //设置service的impl的包名
        packageInfo.setXml("mapper.xml");       //设置mapper.xml的包名
        autoGenerator.setPackageInfo(packageInfo);

        //5. 策略设置
        StrategyConfig strategyConfig = new StrategyConfig();
        strategyConfig.setInclude(tableName);  //设置当前参与生成的表名，参数为可变参数
        strategyConfig.setTablePrefix(tableNamePrefix);  //设置数据库表的前缀名称，模块名 = 数据库表名 - 前缀名  例如： User = sys_user - sys_
        strategyConfig.setNaming(NamingStrategy.underline_to_camel);    //设置表名驼峰命名
        strategyConfig.setColumnNaming(NamingStrategy.no_change);    //设置列名驼峰命名
        strategyConfig.setRestControllerStyle(true);    	//设置是否启用Rest风格
        strategyConfig.setVersionFieldName("version");  	//设置乐观锁字段名
        strategyConfig.setLogicDeleteFieldName("deleted");  //设置逻辑删除字段名
        strategyConfig.setEntityLombokModel(true);  		//设置是否启用lombok
        strategyConfig.setControllerMappingHyphenStyle(true);  //设置controller的驼峰命名（false：驼峰命名；true：-分割）
        TableFill tableFill1 = new TableFill("createTime", FieldFill.INSERT);
        TableFill tableFill2 = new TableFill("updateTime", FieldFill.INSERT_UPDATE);
        List<TableFill> tableFillList = Arrays.asList(tableFill1, tableFill2);
        strategyConfig.setTableFillList(tableFillList);     //设置自动填充
        autoGenerator.setStrategy(strategyConfig);

        //6. 执行生成操作
        autoGenerator.execute();
    }

    public static void main(String[] args) {
        codeGeneratorByManual("comment","","myworld","index");
    }


}
